import pandas as pd
import warnings
import numpy as np

from common.handleExcel import save_to_newexcel_bytime, merge_same_column
from ui.SelectExcelFileSheet import SelectExcelFileSheet

def part23_process_data(selectExcelFileSheet: SelectExcelFileSheet):
    #读取--1.闲置周报表格逻辑关系--1.1基数清单
    url4List, sheetName4List = selectExcelFileSheet.showWindow('1.闲置周报表格逻辑关系--1.1基数清单')
    if url4List is None or sheetName4List is None:
        return
    Base_List = pd.read_excel(url4List, sheetName4List)

    # 读取--1.闲置周报表格逻辑关系--电子监管号匹配实际管理区
    url4List, sheetName4List = selectExcelFileSheet.showWindow('1.闲置周报表格逻辑关系--电子监管号匹配实际管理区')
    if url4List is None or sheetName4List is None:
        return
    Electronic_supervision_number = pd.read_excel(url4List, sheetName4List)

    # 读取--1.闲置周报表格逻辑关系--实际管理区匹配设区市
    url4List, sheetName4List = selectExcelFileSheet.showWindow('1.闲置周报表格逻辑关系--实际管理区匹配设区市')
    if url4List is None or sheetName4List is None:
        return
    Actual_management_area = pd.read_excel(url4List, sheetName4List)

    # 合并
    merged_df = pd.merge(Base_List, Electronic_supervision_number, on='电子监管号', how='inner')

    # 将合并后实际管理区的移动到第一列
    current_net_disposal_rate = merged_df.pop('实际管理区')
    merged_df.insert(0, '实际管理区', current_net_disposal_rate)

    # 合并
    Base_List = pd.merge(merged_df, Actual_management_area, left_on='实际管理区', right_on='实际管理区', how='right')

    # 将合并后实际管理区的移动到第一列
    current_net_disposal_rate = Base_List.pop('设区市')
    Base_List.insert(0, '设区市', current_net_disposal_rate)
    #print(Base_List)

    # 读取---5.闲置台账表格逻辑关系--生成的--成果表1.清单
    url4List, sheetName4List = selectExcelFileSheet.showWindow('5.闲置台账表格逻辑关系--生成的--成果表1.清单')
    if url4List is None or sheetName4List is None:
        return
    Results_Table_1 = pd.read_excel(url4List, sheetName4List)
    #print(Results_Table_1.head())  # 打印前几行查看数据

    # 读取--5.闲置台账表格逻辑关系--8.系统外闲置土地清单（匹配用）
    url4List, sheetName4List = selectExcelFileSheet.showWindow('5.闲置台账表格逻辑关系--8.系统外闲置土地清单（匹配用）')
    if url4List is None or sheetName4List is None:
        return
    List_of_idle_land_outside_the_system = pd.read_excel(url4List, sheetName4List)
    #print(List_of_idle_land_outside_the_system.head())



    # 按 '实际管理区' 列进行分组，并对 '供应面积' 列求和
    # 保留 '设区市' 列的第一个值
    Base_subtotal = Base_List.groupby('实际管理区').agg({'供应面积': 'sum', '设区市': 'first'})

    # 将 '实际管理区' 列恢复为普通列
    Base_subtotal = Base_subtotal.reset_index()

    # 将 '设区市' 列移到最前面
    cols = ['设区市'] + [col for col in Base_subtotal.columns if col != '设区市']
    Base_subtotal = Base_subtotal[cols]

    # 按 '设区市' 列升序排序
    Base_subtotal = Base_subtotal.sort_values(by='设区市', ascending=False)

    # 重命名列
    Base_subtotal.rename(columns={'供应面积': '基数'}, inplace=True)

    # 将 '基数' 列转换为数值类型（如果无法转换，设置为 NaN）
    Base_subtotal['基数'] = pd.to_numeric(Base_subtotal['基数'], errors='coerce')

    #将 '基数' 列乘以 15
    Base_subtotal['基数'] = Base_subtotal['基数'] * 15

    # 生成新的 '任务数' 列
    Base_subtotal['任务数'] = Base_subtotal['基数'] * 0.15


    # 定义需要保留的值
    #values_to_keep = ['基数内闲置土地', '年内新增闲置土地', '预计年内新增闲置土地']
    values_to_keep = ['基数内闲置土地']

    # 筛选出这些值的数据
    filtered_data = Results_Table_1[Results_Table_1['闲置土地类型'].isin(values_to_keep)]

    # 选择需要的列
    filtered_data = filtered_data[['实际管理区', '供应面积']]

    # 对 '实际管理区' 进行分组，统计每个分组的 '供应面积' 总和
    grouped_data_1 = filtered_data.groupby('实际管理区').agg({'供应面积': 'sum'}).reset_index()
    grouped_data_1.rename(columns={'供应面积': '基数内剩余'}, inplace=True)

    # 定义需要保留的值
    values_to_keep = ['年内新增闲置土地']

    # 筛选出这些值的数据
    filtered_data = Results_Table_1[Results_Table_1['闲置土地类型'].isin(values_to_keep)]

    # 选择需要的列
    filtered_data = filtered_data[['实际管理区', '供应面积']]

    # 对 '实际管理区' 进行分组，统计每个分组的 '供应面积' 总和
    grouped_data_2 = filtered_data.groupby('实际管理区').agg({'供应面积': 'sum'}).reset_index()
    grouped_data_2.rename(columns={'供应面积': '年内新增'}, inplace=True)

    # 定义需要保留的值
    values_to_keep = ['预计年内新增闲置土地']

    # 筛选出这些值的数据
    filtered_data = Results_Table_1[Results_Table_1['闲置土地类型'].isin(values_to_keep)]

    # 选择需要的列
    filtered_data = filtered_data[['实际管理区', '供应面积']]

    # 对 '实际管理区' 进行分组，统计每个分组的 '供应面积' 总和
    grouped_data_3 = filtered_data.groupby('实际管理区').agg({'供应面积': 'sum'}).reset_index()
    grouped_data_3.rename(columns={'供应面积': '预计年内新增'}, inplace=True)

    # 合并四张表
    merged_df = Base_subtotal.merge(grouped_data_1, on='实际管理区', how='left')
    merged_df = merged_df.merge(grouped_data_2, on='实际管理区', how='left')
    merged_df = merged_df.merge(grouped_data_3, on='实际管理区', how='left')

    # 计算剩余面积（含预计）合计
    merged_df['剩余面积（含预计）合计'] = merged_df[['基数内剩余', '年内新增', '预计年内新增']].sum(axis=1, skipna=True)

    # 计算 "距离完成任务差距"
    merged_df['距离完成任务差距'] = merged_df['任务数'] - (merged_df['基数'] - merged_df['基数内剩余'] - merged_df['年内新增'])


    # 筛选出 '地方反馈是否可处置' 列为 "是" 的数据
    filtered_data = Results_Table_1[Results_Table_1['地方反馈是否可处置'] == '是']

    # 按 '实际管理区' 分组，并计算每组的 '供应面积' 总和
    grouped_data = filtered_data.groupby('实际管理区')['供应面积'].sum().reset_index()
    grouped_data.rename(columns={'供应面积': '地方反馈可处置总面积'}, inplace=True)
    #print(grouped_data)
    # 使用 merge 按 '实际管理区' 合并两张表
    merged_data = pd.merge(merged_df, grouped_data, on='实际管理区', how='left')


    # 先筛选出地方反馈是否可处置为 '是' 的数据
    disposed_data = Results_Table_1[Results_Table_1['地方反馈是否可处置'] == '是']

    # 然后从这些数据中筛选出是否已开工为 '已开工' 的数据
    disposed_and_started = disposed_data[disposed_data['是否已开工'] == '已开工']

    # 提取相关的实际管理区和供应面积
    result = disposed_and_started[['实际管理区', '供应面积']]

    # 按 '实际管理区' 分组，并计算每组的 '供应面积' 总和
    grouped_data4 = result.groupby('实际管理区')['供应面积'].sum().reset_index()
    grouped_data4.rename(columns={'供应面积': '地方反馈可处置认定已开工面积'}, inplace=True)

    # 使用 merge 按 '实际管理区' 合并两张表
    merged_data = pd.merge(merged_data, grouped_data4, on='实际管理区', how='left')

    # 计算年底应剩余闲置土地面积
    merged_data['年底应剩余闲置土地面积'] = merged_data['基数'].fillna(0) * 0.85

    # 计算剩余闲置土地面积
    merged_data['可处置全部处置完成后剩余闲置土地面积'] = merged_data['剩余面积（含预计）合计'].fillna(0) - merged_data['地方反馈可处置总面积'].fillna(0)

    # 计算距离完成任务差距
    merged_data['可处置全部处置完成后距离完成任务差距'] = merged_data['任务数'] - (merged_data['基数'] - merged_data['可处置全部处置完成后剩余闲置土地面积'])
    merged_data['可处置全部处置完成后距离完成任务差距'] = merged_data.pop('可处置全部处置完成后距离完成任务差距')

    # 计算 剩余闲置土地面积
    merged_data['仅处置已开工剩余闲置土地面积'] = merged_data['剩余面积（含预计）合计'].fillna(0) - merged_data['地方反馈可处置认定已开工面积'].fillna(0)

    # 计算距离完成任务差距
    merged_data['仅处置已开工距离完成任务差距'] = merged_data['任务数'].fillna(0) - (merged_data['基数'].fillna(0) - merged_data['仅处置已开工剩余闲置土地面积'].fillna(0))

    # 按 'XSQMC' 分组，并计算每组的 '台账' 总和
    List_of_idle_land_outside_the_system = List_of_idle_land_outside_the_system.groupby('XSQMC').agg({'台账面积': 'sum'}).reset_index()

    # 重命名列名
    List_of_idle_land_outside_the_system = List_of_idle_land_outside_the_system.rename(columns={'XSQMC': '实际管理区'})

    # 合并
    merged_data = pd.merge(merged_data, List_of_idle_land_outside_the_system, on='实际管理区', how='left')

    city_supply_area = merged_data.groupby('设区市').agg({
        '基数': 'sum',
        '任务数': 'sum',
        '基数内剩余': 'sum',
        '年内新增': 'sum',
        '预计年内新增': 'sum',
        '剩余面积（含预计）合计': 'sum',
        '距离完成任务差距': 'sum',
        '地方反馈可处置总面积': 'sum',
        '地方反馈可处置认定已开工面积': 'sum',
        '年底应剩余闲置土地面积': 'sum',
        '可处置全部处置完成后剩余闲置土地面积': 'sum',
        '可处置全部处置完成后距离完成任务差距': 'sum',
        '仅处置已开工剩余闲置土地面积': 'sum',
        '仅处置已开工距离完成任务差距': 'sum',
        '台账面积': 'sum'
    }).reset_index()

    # 给统计结果添加一列，以便后续插入
    city_supply_area['实际管理区'] = '小计'

    # 创建一个新的数据框来合并
    final_results = []

    # 对每个设区市进行处理
    for city in merged_data['设区市'].unique():
        # 获取该设区市的原始数据
        city_data = merged_data[merged_data['设区市'] == city]

        # 获取该设区市的统计数据
        city_stat = city_supply_area[city_supply_area['设区市'] == city]

        # 将统计数据添加到该设区市数据的下方
        final_results.append(city_data)
        final_results.append(city_stat)

    # 将最终结果合并为一个数据框
    final_df = pd.concat(final_results, ignore_index=True)

    # 1. 统计“小计”行的数据，生成“全省合计”行
    subtotal_row = final_df[final_df['实际管理区'] == '小计']
    if not subtotal_row.empty:
        columns_to_sum = final_df.columns[2:]  # 需要统计的列，从第三列开始
        total_values = final_df[columns_to_sum].sum()

        # 创建一个新的行，命名为“全省合计”
        total_values['实际管理区'] = '全省合计'  # 设置该行的“实际管理区”为“全省合计”

        # 2. 将该行添加到原 DataFrame 中，插入到第一行
        final_df = pd.concat([total_values.to_frame().T, final_df], ignore_index=True)

    # 获取当前所有列
    columns = final_df.columns.tolist()

    # 将 '设区市' 列移到第一列
    columns = ['实际管理区'] + [col for col in columns if col != '实际管理区']

    # 重新排列 DataFrame 的列顺序
    final_df = final_df[columns]

    # 获取当前所有列
    columns = final_df.columns.tolist()

    # 将 '设区市' 列移到第一列
    columns = ['设区市'] + [col for col in columns if col != '设区市']

    # 重新排列 DataFrame 的列顺序
    final_df = final_df[columns]

    # 重命名 '台账' 列
    final_df.rename(columns={'台账面积': '系统外闲置土地'}, inplace=True)

    # 禁用 FutureWarning
    warnings.simplefilter(action='ignore', category=FutureWarning)

    # 填充缺失值并计算处置率
    final_df['当前净处置率'] = (final_df['基数'].fillna(0) - final_df['基数内剩余'].fillna(0) - final_df['年内新增'].fillna(0)) / final_df['基数'].fillna(0)

    # 将 '当前净处置率' 移动到第9列
    current_net_disposal_rate = final_df.pop('当前净处置率')  # 弹出当前净处置率列
    final_df.insert(8, '当前净处置率', current_net_disposal_rate)  # 插入到第9列（索引8）

    # 计算预计处置率
    final_df['可处置全部处置完成后预计处置率'] = (final_df['基数'].fillna(0) - final_df['可处置全部处置完成后剩余闲置土地面积'].fillna(0)) / final_df['基数'].fillna(0)

    # 将 '可处置全部处置完成后预计处置率' 移动到第15列
    current_net_disposal_rate = final_df.pop('可处置全部处置完成后预计处置率')  # 弹出当可处置全部处置完成后预计处置率列
    final_df.insert(14, '可处置全部处置完成后预计处置率', current_net_disposal_rate)  # 插入到第15列（索引14）

    # 计算仅处置已开工预计处置率
    final_df['仅处置已开工预计处置率'] = (final_df['基数'].fillna(0) - final_df['仅处置已开工剩余闲置土地面积'].fillna(0)) / final_df['基数'].fillna(0)

    # 将 '仅处置已开工预计处置率' 移动到第18列
    current_net_disposal_rate = final_df.pop('仅处置已开工预计处置率')  # 弹出当仅处置已开工预计处置率列
    final_df.insert(17, '仅处置已开工预计处置率', current_net_disposal_rate)  # 插入到第18列（索引17）

    # 将这三列数据转换为百分比并保留两位小数
    percent_columns = ['当前净处置率', '可处置全部处置完成后预计处置率', '仅处置已开工预计处置率']
    for col in percent_columns:
        final_df[col] = (final_df[col] * 100).round(2).astype(str) + '%'

    # 将所有列的数据保留小数点后两位
    columns_to_round = ['基数', '基数内剩余', '年内新增', '预计年内新增', '剩余面积（含预计）合计', '距离完成任务差距', '地方反馈可处置总面积', '地方反馈可处置认定已开工面积', '年底应剩余闲置土地面积', '可处置全部处置完成后剩余闲置土地面积', '可处置全部处置完成后距离完成任务差距', '仅处置已开工剩余闲置土地面积', '仅处置已开工距离完成任务差距', '系统外闲置土地']

    # 使用 round() 函数来保留小数点后两位
    final_df[columns_to_round] = final_df[columns_to_round].astype(float).round(2)

    # 替换整个表中的 '-inf%' 为 0
    final_df.replace('-inf%', '0', inplace=True)

    # 如果需要转换为数值类型，并且保留两位小数：
    final_df[columns_to_round] = final_df[columns_to_round].apply(pd.to_numeric, errors='coerce').fillna(0).round(2)

    # 替换整个表中的 'nan%' 为 '0%'
    final_df.replace('nan%', '0', inplace=True)

    # 如果需要转换为数值类型，并且保留两位小数：
    final_df[columns_to_round] = final_df[columns_to_round].apply(pd.to_numeric, errors='coerce').fillna(0).round(2)


    # 在当前可执行目录下创建新的Excel文件，并保存数据
    url4Result,new_sheet_name = save_to_newexcel_bytime(final_df, prefixFileName='成果表3.全省可处置未处置情况表')
    #合并相同的列（把相同的地级市进行合并）
    merge_same_column(url4Result,new_sheet_name)


